package com.dylan.久久为功.夯实基础;

import lombok.ToString;
import org.junit.Test;

import java.util.Calendar;
import java.util.Date;

/**
 * @author ankang
 * @date 2022/5/28 16:45
 * @description 描述
 */
public class 不可变类 {

    /**
     * 自带的不可变类：
     * 基本类型、基本类型的封装类、String等
     *
     * 创建不可变类的基本原则：
     * 1. 类中所有成员变量被private所修饰
     * 2. 类中没有写或者修改成员变量的方法，例如：setxxx。只提供构造函数，一次生成，永不改变
     * 3. 确保类中所有的方法不会被子类覆盖，可以通过把类定义为final或者把类中的方法定义为final来达到这个目的
     * 4. 如果一个类成员不是不可变量，那么在成员变量初始化或者使用get方法获取改成员变量时需要通过clone()方法，来确保类的不可变性
     * 5. 如果有必要，可以重写equals()和hashCode()方法
     */
    @Test
    public void test() {
        ImmutableClass immutableClass = new ImmutableClass(1L, "不可变", new Date());
        Date createTime = immutableClass.getCreateTime();
        // 不会改变类的值
        createTime.setMonth(Calendar.JANUARY);
        System.out.println(immutableClass);
    }

    @ToString
    static final class ImmutableClass{
        private Long id;
        private String name;
        private Date createTime;

        public ImmutableClass(Long id, String name, Date createTime) {
            this.id = id;
            this.name = name;
            this.createTime = (Date) createTime.clone();
        }

        public Long getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public Date getCreateTime() {
            return (Date) createTime.clone();
        }
    }
}
